package com.zzl.springboot_mybatis_demo.aspect;

import org.springframework.expression.EvaluationContext;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

/**
 * Description：EL表达式参数字符处理（占位符处理工具类）
 * Created by 朱正磊 on 2019-08-25 21:55
 */
@SuppressWarnings("ALL")
public class SpelParser {

    private static ExpressionParser parser = new SpelExpressionParser();

    /**
     * description：获取EL表达式参数替换后的字符串值
     * user 朱正磊
     * time 2019-08-25 22:00
     * @param key el表达式字符串，占位符以#开头
     * @param parameterNames 形参名称，可以理解为占位符名称
     * @param args 多数值，可以理解为占位真实值
     * @return 返回EL表达式参数替换后的字符串值
     */
    public static String getValue(String key, String[] parameterNames, Object[] args) {
        //1、将Key字符串解析为el表达式
        Expression expression = parser.parseExpression(key);

        //2、将形参和形参值以配对的方式配置到赋值上下文中
        EvaluationContext context = new StandardEvaluationContext(); //初始化赋值上下文

        if (args.length <= 0) {
            return null;
        }

        for (int i = 0; i < args.length; i++) {
            context.setVariable(parameterNames[i], args[i]);
        }

        //3、根据赋值上下文运算EL表达式
        return expression.getValue(context, String.class);
    }

}
